package Segmentacao;

import Controle.ManipularImagem;
import Estruturas.HistoricoImagem;
import Estruturas.Mascara;
import Estruturas.Mascara5x5;
import Matriz.ManipulacaoMatriz;
import java.util.LinkedList;
import javax.media.jai.PlanarImage;

public class TransformadaDistancia {
    
    private static  Mascara mascaras = new Mascara();
    private static Mascara5x5 mascaras5 = new Mascara5x5();

    
     public static int[][] tikenning(int[][] matrizPixels, int height, int width, int operator) {
         LinkedList<int[][]> listaMascara = null;
         if (operator == 2) {
             listaMascara = mascaras.getMascaras2();
         }
         if (operator == 1) {
             listaMascara = mascaras.getMascaras1();
         }
        for (int i = 0; i < 400; i++) {
            for (int w = 0; w < mascaras.size(); w++) {
                int[][] mascaraAtual = listaMascara.get(w);
                for (int x = 1; x < height-1 ; x++) {
                    for (int y = 1; y < width-1 ; y++) {
                        hitAndMIss3(matrizPixels, x, y, mascaraAtual,height, width);
                    }
                }
            }
        }
        return matrizPixels;
    }

     public static int[][] tikenning2(int[][] matrizPixels, int height, int width, int operator) {
         LinkedList<int[][]> listaMascara = null;
         if (operator == 2) {
             listaMascara = mascaras5.getMascaras2();
         }
         if (operator == 1) {
             listaMascara = mascaras5.getMascaras1();
         }

        for (int i = 0; i < 200; i++) {
            for (int w = 0; w < listaMascara.size(); w++) {
                int[][] mascaraAtual = listaMascara.get(w);
                for (int x = 1; x < height-1 ; x++) {
                    for (int y = 1; y < width-1 ; y++) {
                        hitAndMIss5(matrizPixels, x, y, mascaraAtual,height, width);
                    }
                }
            }
        }
        return matrizPixels;
    }


    //encontra o skiz da imagem
    public static PlanarImage skiz(HistoricoImagem historico) {

        PlanarImage source = historico.getImageAtual();
        int[][] matrizPixels;
        int height = source.getHeight();
        int width = source.getWidth();

        matrizPixels= ManipularImagem.planarToMatriz(source);
        

        tikenning(matrizPixels, height, width, 1);

        //remover depois
        historico.atualizarHistorico(ManipularImagem.matrizToPlanar(matrizPixels, height, width, source));

        tikenning(matrizPixels, height, width, 2);

        return ManipularImagem.matrizToPlanar(matrizPixels, height, width, source);

    }

    public void calcularDistancias() {
    }

    /*
     verifica se o ponto coincide com a mascara
     */
    private static int hitAndMIss3(int[][] matriz, int x, int y, int[][] mascara,int height,int width ) {
        int a = 0;
        int b = 0;
        int limiteX = 3;
        int limiteY = 3;

        if (x==0)
            a=1;
        if (y==0)
            b=1;
        if (x==height-1)
            limiteX=2;
        if(y==width-1)
            limiteY=2;
        
        for (int i = a; i < limiteX; i++) {
            for (int j = b; j < limiteY; j++) {
               if( !(mascara[i][j]== matriz[x-1+i][y-1+j] || mascara[i][j]==-1))
                   return 1;
            }
        }
         matriz[x][y]=1;
        return 0;

    }

    private static int hitAndMIss5(int[][] matriz, int x, int y, int[][] mascara,int height,int width ) {
        int a = 0;
        int b = 0;
        int limiteX = 5;
        int limiteY = 5;

        if (x==0)
            a=2;
        if (y==0)
            b=2;
        if (x==1)
            a=1;
        if (y==1)
            b=1;

        if (x==height-1)
            limiteX=3;
        if(y==width-1)
            limiteY=3;
        if (x==height-2)
            limiteX=4;
        if(y==width-2)
            limiteY=4;

        for (int i = a; i < limiteX; i++) {
            for (int j = b; j < limiteY; j++) {
                if (!(mascara[i][j] == matriz[x - 2 + i][y - 2 + j] || mascara[i][j] == -1)) {
                    return 1;
                }
            }
        }
        matriz[x][y]=1;
        return 0;
    }
}
